home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / demo / mag / Infamia3.lha / infamia03 / mv_code / copper / skip2.s < prev    next >
Text File  |  1996-07-24  |  5KB  |  200 lines

  1.         ************************************
  2.         *       /\/\                       *
  3.         *      /    \                      *
  4.         *     / /\/\ \ O R B_I D           *
  5.         *    / /    \ \   / /              *
  6.         *   / /    __\ \ / /               *
  7.         *   ¯¯     \ \¯¯/ / I S I O N S    *
  8.         *           \ \/ /                 *
  9.         *            \  /                  *
  10.         *             \/                   *
  11.         *     Feel the DEATH inside!       *
  12.         ************************************
  13.         * Coded by:                        *
  14.         * The Dark Coder / Morbid Visions  *
  15.         ************************************
  16.  
  17. ; commenti alla fine del sorgente
  18.  
  19.     SECTION    DK,code
  20.  
  21.     incdir    "Infamia:MV_code/"
  22.     include    MVstartup.s        ; Codice di startup: prende il
  23.                     ; controllo del sistema e chiama
  24.                     ; la routine START: ponendo
  25.                     ; A5=$DFF000
  26.  
  27.         ;5432109876543210
  28. DMASET    EQU    %1000001010000000    ; copper DMA
  29.  
  30.  
  31. START:
  32.     move    #DMASET,dmacon(a5)
  33.     move.l    #COPPERLIST,cop1lc(a5)
  34.     move    d0,copjmp1(a5)
  35.  
  36.     move.l    #copperloop,d0
  37.     move    d0,cpptr1+6
  38.     swap    d0
  39.     move    d0,cpptr1+2
  40.  
  41.     move.l    #copperloop2,d0
  42.     move    d0,cpptr2+6
  43.     swap    d0
  44.     move    d0,cpptr2+2
  45.  
  46. mouse:
  47.  
  48.     bsr    MuoviCopper
  49.  
  50. ; notare il doppio controllo sulla sincronia
  51. ; necessario perche` la muovicopper richiede MENO di UNA rasterline su 68030
  52.     move.l    #$1ff00,d1    ; bit per la selezione tramite AND
  53.     move.l    #$13000,d2    ; linea da aspettare = $130, ossia 304
  54. .Waity1
  55.     move.l    vposr(a5),d0    ; vposr e vhposr
  56.     and.l    d1,d0        ; seleziona solo i bit della pos. verticale
  57.     cmp.l    d2,d0        ; aspetta la linea $130 (304)
  58.     bne.s    .waity1
  59.  
  60. .Waity2
  61.     move.l    vposr(a5),d0
  62.     and.l    d1,d0
  63.     cmp.l    d2,d0
  64.     beq.s    .waity2
  65.  
  66.     btst    #6,$bfe001        ; tasto sinistro del mouse premuto?
  67.     bne.s    mouse            ; se no, torna a mouse:
  68.  
  69.     rts
  70.  
  71. ************************************************
  72. * Questa routine cicla i colori nella copperlist
  73.  
  74. MuoviCopper:
  75.     lea    copperloop,a0
  76.  
  77.     move.w    6(a0),d0
  78.  
  79.     moveq    #7-1,d1
  80. .loop    move.w    14(a0),6(a0)
  81.     addq.l    #8,a0
  82.     dbra    d1,.loop
  83.  
  84.     move.w    d0,6(a0)
  85.  
  86.     lea    copperloop2,a0
  87.  
  88.     move.w    6(a0),d0
  89.  
  90.     moveq    #7-1,d1
  91. muoviloop2
  92.     move.w    14(a0),6(a0)
  93.     addq.l    #8,a0
  94.     dbra    d1,muoviloop2
  95.  
  96.     move.w    d0,6(a0)
  97.     rts
  98.  
  99.     SECTION    MY_COPPER,CODE_C
  100.  
  101. COPPERLIST:
  102.  
  103. ; barra 1
  104.     dc.l $01800111
  105.     dc.l $2907fffe
  106.     dc.l $01800080
  107.     dc.l $01800a0a
  108.     dc.l $2a07fffe
  109.     dc.l $0180011f
  110.     dc.l $2b07fffe
  111.     dc.l $01800000
  112.  
  113.     dc.w    $3007,$FFFE    ; aspetta la linea $30
  114.  
  115. cpptr1
  116.     dc.w    $084,0
  117.     dc.w    $086,0
  118.  
  119. copperloop            ; questo loop viene eseguito al di sopra 
  120.     dc.w    $0007,$87fe    ; della riga $80. Tutte le WAIT hanno
  121.     dc.w    $180,$080    ; il bit piu` significativo della posizione
  122.     dc.w    $0107,$87fe    ; verticale a 0
  123.     dc.w    $180,$0a0
  124.     dc.w    $0207,$87fe    ; WAIT alla riga 2 con bit + significativo a 0
  125.     dc.w    $180,$0c0
  126.     dc.w    $0307,$87fe
  127.     dc.w    $180,$0e0
  128.     dc.w    $0407,$87FE
  129.     dc.w    $180,$0c0
  130.     dc.w    $0507,$87FE
  131.     dc.w    $180,$0a0
  132.     dc.w    $0607,$87FE
  133.     dc.w    $180,$080
  134.     dc.w    $0707,$87FE
  135.     dc.w    $180,$088
  136.     dc.w    $00e1,$80FE
  137.     dc.w    $8007,$ffff
  138.     dc.w    $8a,0
  139.  
  140. cpptr2
  141.     dc.w    $084,0
  142.     dc.w    $086,0
  143.  
  144. copperloop2            ; questo loop viene eseguito al di sotto 
  145.     dc.w    $8007,$87fe    ; della riga $80. Tutte le WAIT hanno
  146.     dc.w    $180,$080    ; il bit piu` significativo della posizione
  147.     dc.w    $8107,$87fe    ; verticale a 1
  148.     dc.w    $180,$0a0
  149.     dc.w    $8207,$87fe    ; WAIT alla riga 2 con bit + significativo a 1
  150.     dc.w    $180,$0c0
  151.     dc.w    $8307,$87fe
  152.     dc.w    $180,$0e0
  153.     dc.w    $8407,$87FE
  154.     dc.w    $180,$0c0
  155.     dc.w    $8507,$87FE
  156.     dc.w    $180,$0a0
  157.     dc.w    $8607,$87FE
  158.     dc.w    $180,$080
  159.     dc.w    $8707,$87FE
  160.     dc.w    $180,$088
  161.     dc.w    $80e1,$80FE
  162.     dc.w    $b007,$ffff
  163.     dc.w    $8a,0
  164.  
  165.     dc.w    $180,$000
  166.     dc.w    $FFDF,$FFFE    ; aspetta la linea 255
  167.  
  168. ; barra 2
  169.     dc.l $01800000
  170.     dc.l $1407fffe
  171.     dc.l $0180011f
  172.     dc.l $1507fffe
  173.     dc.l $01800a0a
  174.     dc.l $1607fffe
  175.     dc.l $01800111
  176.  
  177.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  178.  
  179.     END
  180.  
  181. Questo esempio mostra la necessita` di usare 2 copper loop a causa
  182. dell'impossibilita` di mascherare il bit piu` significativo della posizione
  183. verticale. Usiamo 2 loop che sono assolutamente identici, salvo per il
  184. valore del bit piu` significativo delle WAIT, che vale 0 per il loop eseguito
  185. al di sopra della linea $80 e invece 1 nell'altro.
  186. La necessita` di usare 2 loop ci costringe naturalemte a variare l'indirizzo
  187. contenuto in COP2LC, che deve essere ogni volta l'indirizzo del loop
  188. giusto. Poiche` bisogna caricare COP2LC in maniera sincronizzata al video,
  189. lo facciamo tramite il copper. Carichiamo COP2LC esattamente allo stesso
  190. modo degli altri registri puntatori (BPLxPT, SPRxPT, ecc.) tramite la
  191. copperlist. PRIMA di entrare in un loop, l'indirizzo del loop viene scritto
  192. in COP2LC.
  193. Notate che poiche` usiamo 2 loop la routine processore deve far ruotare i
  194. colori in entrambi i loop. Nonostante cio`, questa tecnica risulta sempre
  195. vantaggiosa rispetto alla tecnica che non fa uso di loop: in questo esempio
  196. realizziamo l'effetto dalla riga $30 alla $b0, per un totale di 128 righe,
  197. che con la tecnica "tradizionale" richiederebbero 128 iterazioni alla routine
  198. che cicla i colori. Grazie ai loop ce la caviamo con 16 iterazioni (8 per ogni
  199. loop), andando quindi ben 8 volte piu` veloci.
  200.